package com.sdy.usercenter.biz.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.sdy.common.model.BizException;
import com.sdy.common.model.BaseModel;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Set;

import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 组织机构信息表
 * </p>
 *
 * @author zzq
 * @since 2019-06-14
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class SysDept extends BaseModel {
    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @TableId
    private Integer id;

    /**
     * 上级节点部门id
     */
    private Integer parentId;

    /**
     * 根节点部门id
     */
    private Integer rootId;

    /**
     * 部门名称
     */
    private String name;

    /**
     * 名称简称
     */
    private String abbreviation;

    /**
     * 部门类型
     * 1：区域
     * 2：单位
     * 3：乡镇街道
     * 4：分类
     * 5：村、社区
     * 6：部门/科室
     * 7：下属单位
     * 8：虚拟组织
     * 9：网格单元
     */
    private Integer type;

    /**
     * 父类型
     */
    @TableField(exist = false)
    private Integer parentType;

    /**
     * 行政级别
3：省级
4：市级
5：县级
6：乡镇街道
7：村、社区
8：网格
     */
    private Integer clazz;
    private Integer level;

    /**
     * 部门唯一code
     */
    private String code;

    /**
     * 统一社会信用代码
     */
    private String uniscid;

    /**
     * 状态 1-正常 2-废弃
     */
    private Integer state;
    
    private String suffix;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = DATETIME_FORMAT)
    private Date createTime;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = DATETIME_FORMAT)
    private Date updateTime;

    @TableField(exist = false)
    private List<SysDept> children;

    @TableField(exist = false)
    private String parentName;

    @TableField(exist = false)
    private String fullName;

    public List<SysDept> toList() throws Exception {
        List<SysDept> result = new ArrayList<>();
        Queue<SysDept> queue = new LinkedList<>();
        queue.offer(this);
        SysDept tmp;
        Set<Integer> idSet = new HashSet<>();
        int maxCnt = 1000;
        while ((tmp = queue.poll()) != null && --maxCnt > 0) {
            if (idSet.contains(tmp.getId())) {
                throw new BizException("项目间存在循环引用");
            }
            result.add(tmp);
            idSet.add(tmp.getId());
            List<SysDept> children = tmp.getChildren();
            if (children != null) {
                children.forEach(queue::offer);
            }
        }
        return result;
    }
}
